package com.artisan.toolcalling.service;

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

/**
 * 日期时间工具类，提供给AI模型调用的工具。
 * 演示Spring AI工具调用的核心功能：信息检索和执行操作
 */
@Service
public class DateTimeTools {

    /**
     * 信息检索工具：获取用户时区的当前日期和时间。
     * 
     * @return ISO-8601 格式的当前日期时间字符串。
     */
    @Tool(description = "Get the current date and time in the user's timezone")
    public String getCurrentDateTime() {
        // 使用Spring的LocaleContextHolder获取用户时区
        ZoneId userZoneId = LocaleContextHolder.getTimeZone().toZoneId();
        return LocalDateTime.now().atZone(userZoneId).toString();
    }

    /**
     * 执行操作工具：设置一个闹钟。
     * 
     * @param time ISO-8601 格式的时间字符串，例如 "2025-10-18T15:30:00"
     */
    @Tool(description = "Set a user alarm for the given time, provided in ISO-8601 format")
    public void setAlarm(@ToolParam(description = "Time in ISO-8601 format") String time) {
        LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
        // 在实际应用中，这里可能会调用系统API或发送消息
        System.out.println("【闹钟已设置】将在 " + alarmTime + " 响铃！");
    }

    /**
     * 获取指定时区的当前时间
     * 
     * @param timezone 时区ID，例如 "Asia/Shanghai", "America/New_York"
     * @return ISO-8601 格式的当前日期时间字符串
     */
    @Tool(description = "Get the current date and time in a specific timezone")
    public String getCurrentDateTimeInTimezone(@ToolParam(description = "Timezone ID, e.g., Asia/Shanghai, America/New_York") String timezone) {
        try {
            ZoneId zoneId = ZoneId.of(timezone);
            return LocalDateTime.now().atZone(zoneId).toString();
        } catch (Exception e) {
            return "无效的时区ID: " + timezone + "，请使用标准时区格式如 Asia/Shanghai";
        }
    }

    /**
     * 计算两个时间之间的差值
     * 
     * @param startTime 开始时间，ISO-8601格式
     * @param endTime 结束时间，ISO-8601格式
     * @return 时间差描述
     */
    @Tool(description = "Calculate the time difference between two timestamps")
    public String calculateTimeDifference(
            @ToolParam(description = "Start time in ISO-8601 format") String startTime,
            @ToolParam(description = "End time in ISO-8601 format") String endTime) {
        try {
            LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ISO_DATE_TIME);
            LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ISO_DATE_TIME);
            
            long minutes = java.time.Duration.between(start, end).toMinutes();
            long hours = minutes / 60;
            long remainingMinutes = minutes % 60;
            
            return String.format("时间差：%d小时%d分钟", hours, remainingMinutes);
        } catch (Exception e) {
            return "时间格式错误，请使用ISO-8601格式";
        }
    }
}
